package com.ceair.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ceair.entity.Oauth2BasicUser;
import com.ceair.entity.request.user.*;
import com.ceair.entity.vo.user.Oauth2BasicUserRoleVO;
import com.ceair.entity.vo.user.Oauth2BasicUserVO;
import com.ceair.entity.result.PageResult;
import com.ceair.entity.result.Result;
import com.ceair.exception.BusinessException;
import com.ceair.service.IOauth2BasicUserService;
import com.ceair.utils.structMapper.Oauth2BasicUserStructMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @author wangbaohai
 * @ClassName Oauth2BasicUserController
 * @description: 针对表【oauth2_basic_user(基础用户信息表)】的数据库操作接口
 * @date 2025年02月14日
 * @version: 1.0.0
 */
@RestController
@RequestMapping("/api/v1/user")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "用户管理", description = "用户管理相关接口")
public class Oauth2BasicUserController {

    private final IOauth2BasicUserService oauth2BasicUserService;

    /**
     * 分页查询用户信息，并将查询结果转换为视图对象（VO）列表。
     *
     * @param oauth2BasicUserReq 包含查询条件的请求对象，不能为null
     * @return 包含分页查询结果的PageResult对象，其中包含转换后的用户信息VO列表和列表大小
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/user/page')")
    @PostMapping("/page")
    @Parameter(name = "oauth2BasicUserReq", description = "用户信息查询请求对象", required = true)
    @Operation(summary = "分页查询用户信息")
    public PageResult<List<Oauth2BasicUserVO>> queryUserWithPage(@RequestBody Oauth2BasicUserReq oauth2BasicUserReq) {
        // 调用服务层方法，获取分页查询结果
        Page<Oauth2BasicUser> page = oauth2BasicUserService.queryUserWithPage(oauth2BasicUserReq);

        // 将查询结果中的记录转换为视图对象（VO）列表
        List<Oauth2BasicUserVO> list =
                Optional.ofNullable(page.getRecords()).orElse(Collections.emptyList()).parallelStream().map(record -> {
                    try {
                        // 使用映射器将实体对象转换为视图对象
                        return Oauth2BasicUserStructMapper.INSTANCE.toVO(record);
                    } catch (Exception e) {
                        // 记录转换失败的错误信息
                        log.error("转换用户信息失败 具体原因为 : {}", e.getMessage());
                        return null;
                    }
                }).filter(Objects::nonNull)
                .toList();

        // 返回包含转换后列表和列表大小的PageResult对象
        return PageResult.success(list, page.getTotal());
    }

    /**
     * 处理用户信息的新增或更新请求
     * 此方法通过POST请求接收用户信息，并将其保存或更新在系统中
     *
     * @param oauth2BasicUserInOrUpReq 用户信息新增或更新请求对象，包含需要保存或更新的用户详细信息
     * @return 返回操作结果，包括成功与否及可能的返回数据
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/user/save')")
    @PostMapping("/save")
    @Parameter(name = "oauth2BasicUserInOrUpReq", description = "用户信息新增或更新请求对象", required = true)
    @Operation(summary = "新增或更新用户信息")
    public Result<Oauth2BasicUserVO> save(@RequestBody Oauth2BasicUserInOrUpReq oauth2BasicUserInOrUpReq) {
        // 初始化
        Oauth2BasicUserVO oauth2BasicUserVO;

        // 调用业务服务层方法，保存或更新用户信息，并将结果封装到Result对象中返回
        try {
            oauth2BasicUserVO = oauth2BasicUserService.save(oauth2BasicUserInOrUpReq);
        } catch (Exception e) {
            log.error("新增或更新用户信息失败 具体原因为 : {}", e.getMessage());
            return Result.error("新增或更新用户信息失败,失败原因：" + e.getMessage());
        }

        return Result.success(oauth2BasicUserVO);
    }

    /**
     * 获取指定用户角色清单以及所有角色清单
     * 该方法通过POST请求获取指定用户的已分配角色以及所有可分配的角色清单
     *
     * @param oauth2BasicUserRoleReq 用户角色查询请求对象，包含用户ID等查询参数
     * @return 返回一个Result对象，其中包含用户角色信息的列表
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/user/getUserRoleList')")
    @PostMapping("/getUserRoleList")
    @Parameter(name = "oauth2BasicUserRoleReq", description = "用户角色查询请求对象", required = true)
    @Operation(summary = "获取指定用户角色清单以及所有角色清单")
    public Result<Oauth2BasicUserRoleVO> getUserRoleList(@RequestBody Oauth2BasicUserRoleReq oauth2BasicUserRoleReq) {
        // 调用业务服务层方法获取用户角色清单，并将结果封装到Result对象中返回
        return Result.success(oauth2BasicUserService.getUserRoleList(oauth2BasicUserRoleReq));
    }

    /**
     * 更新用户角色信息
     *
     * 该接口用于更新用户的角色信息，通过接收用户角色更新请求数据来实现
     * 主要用途是当用户的角色发生变化时，通过该接口来同步更新系统中的用户角色信息
     *
     * @param updateUserRolesReq 用户角色更新请求对象，包含需要更新的用户角色信息，是更新操作的必要参数
     * @return 返回更新后的用户角色信息，封装在Result对象中
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/user/updateUserRoles')")
    @PostMapping("/updateUserRoles")
    @Parameter(name = "updateUserRolesReq", description = "用户角色更新请求对象", required = true)
    @Operation(summary = "更新用户角色")
    public Result<Oauth2BasicUserRoleVO> updateUserRoles(@RequestBody UpdateUserRolesReq updateUserRolesReq) {
        // 调用业务服务层方法更新用户角色信息，并将结果封装到Result对象中返回
        Oauth2BasicUserRoleVO result;
        try {
            result = oauth2BasicUserService.updateUserRoles(updateUserRolesReq);
        } catch (BusinessException e) {
            // 处理异常，记录错误信息
            log.error("更新用户角色失败 具体原因为 : {}", e.getMessage());
            return Result.error("更新用户角色失败 具体原因为 : " + e.getMessage());
        }
        return Result.success(result);
    }

    /**
     * 处理用户删除请求的接口方法
     * 该方法使用POST请求映射到"/delete"路径，用于删除用户
     *
     * @param deleteUserReq 用户删除请求对象，包含删除用户所需的信息，如用户ID等
     * @return 返回一个Result对象，封装了删除操作的结果状态
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/user/delete')")
    @PostMapping("/delete")
    @Parameter(name = "deleteUserReq", description = "用户删除请求对象", required = true)
    @Operation(summary = "删除用户")
    private Result<Boolean> delete(@RequestBody DeleteUserReq deleteUserReq) {
        // 调用服务层的delete方法执行用户删除操作，并将结果封装到Result对象中返回
        Boolean result;
        try {
            result = oauth2BasicUserService.delete(deleteUserReq);
        } catch (BusinessException e) {
            // 处理异常，记录错误信息
            log.error("删除用户失败 具体原因为 : {}", e.getMessage());
            return Result.error("删除用户失败,失败原因：" + e.getMessage());
        }

        return Result.success(result);
    }

}
